#include "GInput.h"
#include "GInputDevice.h"
#include "GInputContext.h"

#include "GError.h"

namespace GEngine
{
	
	GInputMap::GInputMap()
	{
	}

	GInputMap::~GInputMap()
	{
		ClearInputs();
	}

	void GInputMap::SetActive(bool Value)
	{
		Active = Value;
	}

	bool GInputMap::GetActive() const
	{
		return Active;
	}

	void GInputMap::ClearInputs()
	{
		Inputs.Clear();
	}

	GUtil::GHandle GInputMap::AppendInput(const GInput& Input)
	{
		GUtil::GHandle Handle;
		Inputs.Reserve(Handle, Input);

		return Handle;
	}

	void GInputMap::RemoveInput(const GUtil::GHandle& Handle)
	{
		Inputs.Recycle(Handle);
	}

	const GInput* GInputMap::GetInput(const GUtil::GHandle& Handle) const
	{
		return Inputs.GetPtr(Handle);
	}

	bool GInputMap::CheckInput(GUtil::GHandle Handle0) const
	{
		if (!Active)
		{
			return false;
		}

		const GInput* Input0 = GetInput(Handle0);

		bool Check0 = Input0->GetDevice()->CheckInput(Input0);

		return Check0;
	}

	bool GInputMap::CheckInput(GUtil::GHandle Handle0, GUtil::GHandle Handle1) const
	{
		if (!Active)
		{
			return false;
		}

		const GInput* Input0 = GetInput(Handle0);
		const GInput* Input1 = GetInput(Handle1);

		bool Check0 = Input0->GetDevice()->CheckInput(Input0);
		bool Check1 = Input1->GetDevice()->CheckInput(Input1);

		return Check0 && Check1;
	}

	bool GInputMap::CheckInput(GUtil::GHandle Handle0, GUtil::GHandle Handle1, GUtil::GHandle Handle2) const
	{
		if (!Active)
		{
			return false;
		}

		const GInput* Input0 = GetInput(Handle0);
		const GInput* Input1 = GetInput(Handle1);
		const GInput* Input2 = GetInput(Handle2);

		bool Check0 = Input0->GetDevice()->CheckInput(Input0);
		bool Check1 = Input1->GetDevice()->CheckInput(Input1);
		bool Check2 = Input2->GetDevice()->CheckInput(Input2);

		return Check0 && Check1 && Check2;
	}
}